package service

import (
	configService "cm2/service/config"
	"cm2/service/irisweb"
	logService "cm2/service/log"
	"cm2/service/task"

	"github.com/kataras/golog"
)

// Service 接口定义
type Service interface {
	Start() error
	Shutdown()
	SetLogger(logger *golog.Logger)
	Logger() *golog.Logger
}

// SId Service Id 请注意唯一性
var SId string

// SName Service Name
var SName string

// SType Service Type
var SType string

// DefaultConfig 默认配置信息
var DefaultConfig map[string]interface{}

// webServices 注册到主服务实例的 web服务实例
var webServices map[string]*irisweb.Webapp

// taskServers 注册到主服务实例的任务服务实例
var taskServers map[string]*task.Server

// taskClients 注册到主服务实例的任务服务实例
var taskClients map[string]*task.Client

// jobServices 注册到主服务实例的作业实例
var jobServices map[string]*task.JobService

// Init 初始化应用程序
func Init() {
	defer func() {
		if recoverErr := recover(); recoverErr != nil {
			logService.DefaultLogger().Fatalf("application initialization failed: %v", recoverErr)
			return
		}
	}()

	var err error

	// 创建系统保留日志记录器
	logService.CreateReservedDefaultLogger()

	// 加载默认配置文件
	DefaultConfig, err = configService.LoadDefaultConfig()
	if err != nil {
		panic(err)
	}
	setGlobalParams(DefaultConfig)

	// 初始化日志记录器
	logsConf, ok := DefaultConfig["logs"]
	if ok {
		logService.Init(logsConf.([]interface{}))
	} else {
		logService.DefaultLogger().Warn("no logger configuration found")
	}
}

// RegisterWebapp 将 irisweb.Webapp 实例注册到主服务
func RegisterWebapp(name string, app *irisweb.Webapp) {
	if webServices == nil {
		webServices = make(map[string]*irisweb.Webapp)
	}

	if name == "" {
		name = "default"
	}

	webServices[name] = app
}

// DefaultWebapp 获取默认的已注册的 irisweb.Webapp 实例
func DefaultWebapp() *irisweb.Webapp {
	return Webapp("default")
}

// Webapp 获取指定的已注册的 irisweb.Webapp 实例
func Webapp(name string) *irisweb.Webapp {
	if webServices == nil {
		logService.DefaultLogger().Warn("webapp service host must initialize before use")
		return nil
	}

	return webServices[name]
}

// RegisterTaskServer 将 task.Server 实例注册到主服务
func RegisterTaskServer(name string, svr *task.Server) {
	if taskServers == nil {
		taskServers = make(map[string]*task.Server)
	}

	if name == "" {
		name = "default"
	}

	taskServers[name] = svr
}

// DefaultTaskServer 获取默认的已注册的 task.Server 实例
func DefaultTaskServer() *task.Server {
	return TaskServer("default")
}

// TaskServer 获取指定的已注册的 task.Server 实例
func TaskServer(name string) *task.Server {
	if taskServers == nil {
		logService.DefaultLogger().Warn("task server service host must initialize before use")
		return nil
	}

	return taskServers[name]
}

// RegisterTaskClient 将 task.Client 实例注册到主服务
func RegisterTaskClient(name string, clnt *task.Client) {
	if taskClients == nil {
		taskClients = make(map[string]*task.Client)
	}

	if name == "" {
		name = "default"
	}

	taskClients[name] = clnt
}

// DefaultTaskClient 获取默认的已注册的 task.Client 实例
func DefaultTaskClient() *task.Client {
	return TaskClient("default")
}

// TaskClient 获取指定的已注册的 task.Client 实例
func TaskClient(name string) *task.Client {
	if taskClients == nil {
		logService.DefaultLogger().Warn("task client service host must initialize before use")
		return nil
	}

	return taskClients[name]
}

// RegisterJobService 将 task.JobService 实例注册到主服务
func RegisterJobService(name string, svr *task.JobService) {
	if jobServices == nil {
		jobServices = make(map[string]*task.JobService)
	}

	if name == "" {
		name = "default"
	}

	jobServices[name] = svr
}

// DefaultJobService 获取默认的已注册的 task.Server 实例
func DefaultJobService() *task.JobService {
	return JobService("default")
}

// JobService 获取指定的已注册的 task.Server 实例
func JobService(name string) *task.JobService {
	if jobServices == nil {
		logService.DefaultLogger().Warn("job service host must initialize before use")
		return nil
	}

	return jobServices[name]
}

func setGlobalParams(config map[string]interface{}) {
	SId = config["sid"].(string)
	SName = config["sname"].(string)
	SType = config["stype"].(string)
}
